工厂模式(Factory Pattern)
工厂模式是一种创建型设计模式,用于创建对象的过程中抽象了对象的创建方式。它定义了一个接口或基类,该接口包含一个或多个工厂方法,这些方法用于创建对象的不同类型或变体。工厂模式将对象的创建与客户端代码解耦,允许客户端在不必关心具体对象创建细节的情况下创建对象。
场景
对象创建的复杂性:当对象的创建涉及到复杂的逻辑、条件判断、或多个步骤时,工厂模式可以将这些创建细节封装在工厂方法内,使客户端代码更加简洁和可维护。
遵循开放封闭原则:工厂模式有助于在不修改现有客户端代码的情况下添加新的对象类型或变体。这符合开放封闭原则,即对扩展开放,对修改关闭。
封装具体类的实现:工厂模式允许你将具体类的实现细节封装在工厂方法内,从而隐藏这些细节,以提高代码的封装性和安全性。
实现
js
// 工厂方法:用于创建不同类型的产品
function createProduct(type) {
if (type === "A") {
return new ConcreteProductA();
} else if (type === "B") {
return new ConcreteProductB();
} else {
throw new Error("Invalid product type");
}
}
// 具体产品类A
function ConcreteProductA() {
this.type = "Product A";
this.operation = function () {
console.log("Operation for Product A");
};
}
// 具体产品类B
function ConcreteProductB() {
this.type = "Product B";
this.operation = function () {
console.log("Operation for Product B");
};
}
// 使用工厂方法创建产品
const productA = createProduct("A");
const productB = createProduct("B");
productA.operation(); // 输出 "Operation for Product A"
productB.operation(); // 输出 "Operation for Product B"
在上面的示例中,createProduct 是工厂方法,根据传递的参数来创建不同类型的产品对象。ConcreteProductA 和 ConcreteProductB 是具体产品类,它们实现了相同的接口或基类,这里是没有明确的接口或基类的,但通常会使用接口或基类来定义产品共享的方法和属性。
工厂模式的一个优点是可以轻松扩展和添加新的产品类型,只需要扩展工厂方法即可,而不必修改客户端代码。这种设计使代码更灵活和可维护。